
import { _decorator, Component, Node } from 'cc';
import { ComponentBase } from './ComponentBase';
import { Message, MessageType } from './Message';
import { MessageCenter } from './MessageCenter';
const { ccclass, property } = _decorator;

/**
 * Predefined variables
 * Name = MessageBase
 * DateTime = Sat Feb 05 2022 15:08:27 GMT+0800 (China Standard Time)
 * Author = vvc_zeng
 * FileBasename = MessageBase.ts
 * FileBasenameNoExtension = MessageBase
 * URL = db://assets/script/framework/MessageBase.ts
 * ManualUrl = https://docs.cocos.com/creator/3.3/manual/zh/
 *
 */
// 第三步：写中间管理者，他要先向消息中心报到，同时记录自身部门管理的员工。在接收消息时判断如果是自己部门的，则分发消息给部门所有员工
export class MessageBase extends ComponentBase {
    messageType: MessageType;
    ReceiveList: ComponentBase[];
    onLoad() {
        this.ReceiveList = [];
        // 设置当前管理类接收的消息类型 UI 敌人 音频
        this.init()
        // 把管理类注册到管理中心
        MessageCenter.ReceiveList.push(this);
    }
    init() {
        // 默认设置成 UI 管理，如果想设置成其他类型，重写此方法即可
        this.messageType = MessageType.TYPE_UI;
    }
    // 注册消息监听,让管理类去管理它的所有子类(子类创建时调用此方法将自身注册到管理者上)
    RegisterReceiver(cb: ComponentBase) {
        this.ReceiveList.push(cb);
    }
    ReveiveMessage(message: Message) {
        // 先执行父类 ComponentBase 的同名方法 避免自动覆盖
        super.ReveiveMessage(message);
        // 判断消息类型
        if (message.Type != this.messageType) {
            // 不是这个部门的消息则丢弃消息
            return
        }
        if (this.ReceiveList != null) {
            // 是这个部门的消息则转发给下面的所有子类
            for (const c of this.ReceiveList) {
                // 子类接收消息
                c.ReveiveMessage(message);
            }
        } else {
            console.log("framework error", this.ReceiveList);
        }
    }
}